﻿/*****************************************************************//**
 * @file    GUIPickInfo.h
 * @brief   拾取状态信息。

 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-10-31
 *********************************************************************/

#ifndef __GUIPICKINFO_H__
#define __GUIPICKINFO_H__

#include <QObject>

#include "PickDataProviderAPI.h"

namespace GUI
{
    struct GUIPickInfoStru;
    
    /**
     * @brief   拾取方法信息。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-10-31
     */
    class PICKDATAPROVIDERAPI GUIPickInfo : public QObject
    {
        Q_OBJECT
    public:
        /**
         * @brief   拾取对象类型。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        enum PickObjType
        {
            POBJNone = 0,                  // 关闭（开启全部双击对象可视化状态）。
            POBJAll,                       // 混合（全部可拾取对象）。
            POBJAllExceptModel,            // 混合（除几何、网格模型外全部对象）。
            POBJGeometryVert,              // 几何点。
            POBJGeometryEdge,              // 几何线。
            POBJGeometryFace,              // 几何面。
            POBJGeometrySolid,             // 几何体。
            POBJGeometry,                  // 几何所有信息（点、线、面）
            POBJMeshCell,                  // 网格单元。
            POBJMeshCell1D,                // 网格线（梁）单元。
            POBJMeshCell2D,                // 网格面单元。
            POBJMeshCell3D,                // 网格体单元。
            POBJDiscNode,                  // SEA节点。
            POBJSEASubSystem,              // SEA子系统（SEA梁 & SEA板 & SEA声腔）。
            POBJSEABeam,                   // SEA梁。
            POBJSEAShell,                  // SEA壳（板）。
            POBJSEAShellAndCavity,         // SEA壳（板）与声腔。
            POBJSEACavity,                 // SEA声腔。
            POBJSEASemiInfFluid,           // SEA半无限流体。
            POBJJunctions,                 // 连接关系（所有类型）
            POBJSEAJunctions,              // SEA连接关系（所有类型）。
            POBJSEAJunctionPoint,          // SEA连接点。
            POBJSEAJunctionLine,           // SEA连接线。
            POBJSEAJunctionArea,           // SEA连接区域。
            POBJLoadAll,                   // 全部载荷
            POBJFEFace,                    // FE面
            POBJFEStructure,               // FE结构
            POBJFEAcoustic,                // FE声腔
            POBJSensor,                    // 传感器
            POBJSubSystem,                 // 全部子系统（SEA梁 & SEA板 & SEA声腔 &半无限流体 & FE面 & FE结构-板 & FE结构-梁 & FE声腔 & 传感器）
            POBJSubSysOutBeamSemiFEFaceSensor,   // 全部子系统除了梁、半无限流体、FE面、传感器（SEA板 & SEA声腔 & FE结构-板 & FE声腔）
        };
        Q_ENUM(PickObjType);

        /**
         * @brief   拾取方式。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        enum PickMethod
        {
            PMNone = 0,     // 关闭。           
            PMIndividually, // 默认拾取方式。（点选+框选+追加拾取）           
            PMSingle,       // 单独数据拾取方式。（点选+追加拾取）         
            PMByMeshProp,   // 根据网格属性拾取方式。（点选+追加拾取）

        };
        Q_ENUM(PickMethod);

        /**
         * @brief   清除拾取状态信息。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        static void ClearPickInfo();

        /**
         * @brief   设置拾取方式信息。
         * @param   info：拾取方式信息
         * @param   dataObjId：开启拾取状态的数据ID[缺省]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        static void SetPickInfo(GUIPickInfoStru info, int dataObjId = -1);

        /**
         * @brief   获取拾取方式信息。
         * @return  拾取方式信息
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        static GUIPickInfoStru GetPickInfo();

    private:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        GUIPickInfo() = default;

        /**
         * @brief   析构函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-31
         */
        ~GUIPickInfo() = default;

    };

    /**
     * @brief   拾取方式信息结构体。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-10-31
     */
    struct GUIPickInfoStru
    {
        // 拾取对象类型。
        GUIPickInfo::PickObjType _pickObjType{ GUIPickInfo::POBJNone };

        // 拾取方法。
        GUIPickInfo::PickMethod _pickMethod{ GUIPickInfo::PMNone };

        // 拾取空白区域自动清空已拾取数据。
        bool _autoClear = true;
    };
}

#endif // __GUIPICKINFO_H__
